package com.ddwanglife.lamda;

import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

/**
 * 验证stream运行机制
 * 1，所有操作是链式调用，一个元素只迭代一次
 * 2，每一个中间操作返回一个新的流
 *  流里面有一个属性sourceStage 执行同一个地方，就是Head
 * 3，Head->nextStage->nestStage->...->null
 * 4，通过执行结果判断，中间的有状态（两个入参）操作把前后的链式调用给截断了，单独处理
 * 5，并行环境下，有状态的中间操作不一定能并行操作
 * 6，parallel/sequetial这两个操作也是中间操作（也是返回stream）
 *  但是他们不创建流，他们只修改Head的并行标志 sourceStage parallel
 */
public class RunStreamDemo {
    public static void main(String[] args) {
        Random random = new Random();
        //随机产生数据
       Stream<Integer> stream = Stream.generate(()->random.nextInt())
                //产生500个（无限流需要短路操作）
                .limit(100)
                //第一个无状态操作
                .peek(s->print("peek:"+s))
                //第二个无状态操作
                .filter(s->{
                    print("filter:"+s);
                    return s>1000000;
                })
               //有状态操作
               .sorted((i1,i2)->{
                   print("排序："+i1+","+i2);
                   return i1.compareTo(i2);
               })
               //又一个无状态操作
               .peek(s->{
                   print("peek2:"+s);
               })
               .parallel();
                //终止操作
        stream.count();
    }
    public static void print(String s){
        try {
            TimeUnit.MILLISECONDS.sleep(5);
            System.out.println(s);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
